prepare-root: set up /boot bind-mount for single partition systems
authorDaniel Drake <drake@endlessm.com>
Tue, 21 Jul 2015 14:04:34 +0000 (08:04 -0600)
committerColin Walters <walters@verbum.org>
Fri, 16 Oct 2015 01:36:21 +0000 (21:36 -0400)
When booting from a system with /boot on the main partition, set up
an appropriate bind mount during boot. The ostree runtime binary
expects to be able to access the bootloader configs at /boot.

See: https://mail.gnome.org/archives/ostree-list/2015-July/msg00015.html

https://bugzilla.gnome.org/show_bug.cgi?id=756267

src/switchroot/ostree-prepare-root.c

index bb9ba13eb1aefa5a7092dca11ccaf7f0d607646f..3de137bb365b82bbf4f30ed3c7a5763d00d33f39 100644 (file)
@@ -194,6 +194,23 @@ main(int argc, char *argv[])
       exit (EXIT_FAILURE);
     }
 
+  /* If /boot is on the same partition, use a bind mount to make it visible
+   * at /boot inside the deployment. */
+  snprintf (srcpath, sizeof(srcpath), "%s/boot/loader", root_mountpoint);
+  if (lstat (srcpath, &stbuf) == 0 && S_ISLNK (stbuf.st_mode))
+    {
+      snprintf (destpath, sizeof(destpath), "%s/boot", newroot);
+      if (lstat (destpath, &stbuf) == 0 && S_ISDIR (stbuf.st_mode))
+        {
+          snprintf (srcpath, sizeof(srcpath), "%s/boot", root_mountpoint);
+          if (mount (srcpath, destpath, NULL, MS_BIND, NULL) < 0)
+            {
+              perrorv ("failed to bind mount %s to %s", srcpath, destpath);
+              exit (EXIT_FAILURE);
+            }
+        }
+    }
+
   /* Set up any read-only bind mounts (notably /usr) */
   for (i = 0; readonly_bind_mounts[i] != NULL; i++)
     {